{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Линейная алгебра. Урок 1. Линейное пространство. Основные понятия. Часть 2.ipynb",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.1"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "X2Z2Z_K5c7Zv"
      },
      "source": [
        "# Урок 2"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "c9EHjpDAc7Zy"
      },
      "source": [
        "# Линейное пространство. Основные понятия. Часть 2"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wua5iO3ec7Zz"
      },
      "source": [
        "## Евклидово пространство"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Z04nPQHDc7Z1"
      },
      "source": [
        "__Определение__\n",
        "\n",
        "Линейное пространство над полем вещественных чисел называется _евклидовым пространством_, если на нем введено правило, согласно которому каждой упорядоченной паре векторов $x$ и $y$ поставлено в соответствие вещественное число, называемое _скалярным произведением_ и обозначаемое символом $(x, y)$.\n",
        "\n",
        "При этом указанное правило должно подчиняться четырем аксиомам:<br>\n",
        "1) $(x,y)=(y,x);$<br>\n",
        "2) $(\\lambda x, y)=\\lambda(x, y);$<br>\n",
        "3) $(x_{1}+x_{2},y)=(x_{1},y)+(x_{2},y);$<br>\n",
        "4) $(x, x)\\geq0$, причем $(x,x)=0\\Leftrightarrow x=0.$\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yQfL1Uz0c7Z2"
      },
      "source": [
        "__Пример__\n",
        "\n",
        "Из школьной программы известно, что в стандартном понимании в трехмерном пространстве скалярное произведение двух векторов определяется как произведение длин этих векторов на косинус угла между ними (см. рис.):\n",
        "\n",
        "$$(x, y) = \\left|x\\right|\\cdot\\left|y\\right|\\cdot cos\\alpha.$$"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "02m3_NDsBHUf"
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "MED517L-c7Z5"
      },
      "source": [
        "\n",
        "# запустите последовательно код в ячейках, чтобы отобразить иллюстрации\n",
        "import matplotlib.pyplot as plt"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 258
        },
        "id": "0XE1K47qc7Z_",
        "outputId": "1421c131-8c74-4744-9903-f2d768bf3df0"
      },
      "source": [
        "fig = plt.figure()\n",
        "ax = fig.add_subplot(1,1,1)\n",
        "\n",
        "ax.spines['left'].set_position('zero')\n",
        "ax.spines['bottom'].set_position('zero')\n",
        "\n",
        "ax.spines['right'].set_color('none')\n",
        "ax.spines['top'].set_color('none')\n",
        "\n",
        "plt.axis('scaled')\n",
        "plt.xlim(-2, 2)\n",
        "plt.ylim(-2, 2)\n",
        "\n",
        "ax.arrow(0, 0, 0.6, 2, head_width=0.15, head_length=0.2, length_includes_head=True, facecolor='red')\n",
        "ax.arrow(0, 0, 2, 0.4, head_width=0.15, head_length=0.2, length_includes_head=True, facecolor='black')\n",
        "ax.annotate(\"y\", xy=(1.8, 0.6))\n",
        "ax.annotate(\"x\", xy=(0.7, 1.8))\n",
        "ax.annotate(\"\\u03B1\", xy=(0.2, 0.2))\n",
        "\n",
        "plt.show()"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPIAAADxCAYAAADx/OoKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAWi0lEQVR4nO3dfVBU570H8O8jCwSikkgkkoXWC4sKi7DKmlKvsVUDKirWvFgSG7XgQFuc5E4SWzvpONNYlXYmd2zG3KRbU5W0Qq/GBGOERNs4YxVFSRiDGMtVkwC+gBGNoAguz/1D3RHYhZV9OS/7/czsJMs+e/a3kG/O2bO/8zxCSgki0rYhShdARJ5jkIl0gEEm0gEGmUgHGGQiHWCQiXSAQVYhIUSsEOITIUSdEOK4EOIFJ2OEEOJ1IcT/CSGOCSEmKlErqYNB6QLIqZsAXpJSfiqEGAagWgixR0pZd9eY2QASbt++B+DN2/+kAMQ9sgpJKc9JKT+9/e9XAZwAYOw1bD6AYnnLIQAPCCGi/VwqqYSnQZa8+fb25ZdfytjY2OwrV658fPfP58yZk79///6td+5Pnz59zJEjR872fr7NZpNWq1VarVZpNpsVex8dHR1yRnq6fO+99xT/nWrs5hbukVWsra0NTz75JNavX4/hw4cPahv5+fk4evQojh49irCwMC9X6L4Xf/ELHDh8GLWff65YDXrGIKtUV1cXnnzySSxatAhPPPFEn8eNRiMaGhoc9xsbG2E09j76Voetf/0r9vz97/glgNbmZqXL0SUGWYWklMjLy0NiYiJefPFFp2Oys7NRXFwMKSUOHTqEiIgIREer7yPyiRMn8EJBAbZfu4bRAC6dP690SbrEs9YqdODAAbzzzjsYP348LBYLAGDt2rX4+uuvAQA/+9nPkJWVhd27d8NkMiE8PBybNm1SsmSn2tvb8XRWFoquX0cqgNMAWi9eVLosXWKQVWjKlCkY6PJSIQTeeOMNP1V076SU+MVPf4q08+eRe/u9jADQeumSsoXpFA+tySfettlQ/eGH+J+ODojbP3sQQOuVK07HHzlyBCkpKejo6EB7ezvMZjNqa2v9Vq/WCQ8nFvDoyeRfVqsVR48e9fnr1NTUIGPyZOy/fh3j7vp5A4D0Bx5AU2ur0+f95je/QUdHB65fv46YmBj8+te/9nmtGiAGHsIgBxR/BPnKlSuwJiXh1bNn8Uyvx9oARAUH41pnp9PndnZ2YtKkSbjvvvtw8OBBBAUF+bRWjXAryDy0Jq8q3boVLc3NuADgVK/H7gdw025HR0eH0+d+8803aGtrw9WrV12OIecYZPKqxUuXYsv27ah99ln85/DhEADygoKwH4AdwIOhoWh1cWhdUFCA1atXY9GiRfjVr37lz7I1j2etyavCwsIwf/58zJ8/H21tbRg2bBi6n3kGzx88iIazZ9HW2YnLly/3+c67uLgYwcHBePbZZ2G32zF58mT885//xPTp0xV6J9rCz8gBxF8nu+5YtWoVVq9e7fgqraGhATU1NZg7dy6EcOujH/FkF/Xm7yALIRAcHIxOFye3yC082UXKubODsNlsClcSGBhk8omysjIAwOLFixWuJDAwyOQTBQUFAIAhQ/ifmD/wt0w+0dzcjMLCQqXLCBgMMnldfX09AODVV19VuJLAwSCT173wwq1JP0eMGKFwJYGDQSavKy8vR3p6utJlBBQGmbyqvb0dAFR9rbQeMcjkVb///e8BABMncr58f2JnVwDxR2cXu7m8jp1dWpWbm4uoqCgkJyc7fXzfvn2IiIiAxWKBxWJRzdlhdnMph1c/qdDSpUuxfPnyfruiHnvsMezatcuPVQ2M3VzK4R5ZhaZOnarJr27YzaUc/sY1qrKyEqmpqZg9ezaOHz+udDkA2M2lJB5aa9DEiRPx1VdfYejQodi9ezd+9KMfObqperPZbI7PrC0tLT6rid1cyuIeWYOGDx+OoUOHAgCysrLQ1dWFiy4mfr977aeRI0f6rCZ2cymLQdag8+fPO84QV1VVobu7G5GRkYrWxG4uZfHQWoWeeeYZ7Nu3DxcvXkRMTAx++9vfoqurC8Ct5WK2b9+ON998EwaDAWFhYSgtLVV06hx2cymPDSEBxFcNIb3n5iKv4pxd1JOvgsxuLp9iZxf5Hru51IFBJo+wm0sdGGTyCLu51IG/ffIIu7nUgUGmQWM3l3owyDRo7OZSDwaZBo3dXOrBINOgsJtLXRhkGhTOzaUu7OwKIN7s7GI3l9+ws4t8g91c6sMg0z1jN5f6MMh0z9jNpT78S9A9YzeX+jDIdE/YzaVODDLdE3ZzqRODTPeE3VzqxCCT29jNpV4MskoNtP6TlBLPP/88TCYTUlJS8Omnn/q8JnZzqReDrFJLly5FRUWFy8fLy8tRX1+P+vp62Gw2/PznP/d5TatXr0ZwcLDPX4fuHYOsUgOt/1RWVobFixdDCIH09HRcvnwZ586d81k97OZSNwZZo5qamhAbG+u4HxMTg6ampj7jbDYbrFYrrFarR0vGsJtL3RhknfPWkjHs5lI3/lU0ymg0oqGhwXG/sbERRqPRZ6/Hbi51Y5A1Kjs7G8XFxZBS4tChQ4iIiEB0dLRPXovdXOrHtZ9UaqD1n7KysrB7926YTCaEh4dj06ZNPquF3Vzqx4kFAshgJxa4c2a8srLSB1XRADixAHmO3VzawCBTv9jNpQ08tA4ggzm05txciuOhNXmG3VzawSCTS+zm0g4GmVxiN5d28C9ELrGbSzsYZHKK3VzawiCTU+zm0hYGmZzi3FzawiBTH+zm8q1Vq1Zh/fr1jvuvvPIK/vjHP3q0TQaZ+mA3l2/l5uaiuLgYANDd3Y3S0lL85Cc/8WibvPqJ+uDcXL41evRoREZG4rPPPsOFCxcwYcIEREZGerRNBpl6YDeXfyxbtgybN2/G+fPnkZub6/H22GsdQNzptX7//fexYMEC2O12NoL4UGdnJ8aPH4+uri7U19cjKCjI1VC3eq25R6Ye2M3lHyEhIZg2bRoeeOCB/kLsNgaZemA3l390d3fj0KFD2LZtm1e2x//tkgO7ufyjrq4OJpMJM2bMQEJCgle2ySCrVEVFBcaOHQuTyYSioqI+j2/evBkjR46ExWKBxWLBxo0bPX5NdnP5R1JSEk6fPo3XXnvNa9vkobUK2e12FBYWYs+ePYiJicGkSZOQnZ2NpKSkHuN+/OMfY8OGDV57XXZzaRf3yCpUVVUFk8mEuLg4hISEICcnx3FtsK+wm0vbGGQVcnc5mHfffRcpKSl46qmnekxWfzd3l4xhN5e2McgaNW/ePHz55Zc4duwYMjIysGTJEqfj3F0yht1c2sYgq5A7y8FERkYiNDQUwK0uoerq6kG/Hru5/MfDBiyXeLJLhSZNmoT6+nqcOXMGRqMRpaWl2Lp1a48x586dcywRs3PnTiQmJg769Tg3l/9MnDgRX3/9NRISEjBx4kRMmDABiYmJSEpK8ujbAgZZhQwGAzZs2ICZM2fCbrcjNzcXZrMZq1atgtVqRXZ2Nl5//XXs3LkTBoMBI0aMwObNmwf9euzm8h8pJS5duoTDhw/j8OHDCA8PR3BwMK5du4awsDDEx8fDYrEgLS0NSUlJmDZtmlvbZa91AHHVay2EQGFhoVe/yiLnli9f7tY3A0FBQbDb7ZBScl5rGhi7ufxr8uTJGDp0aL9jwsPD8cgjj2Dfvn1ub5dBDnDs5vKtkydPYsWKFRg+fDiEEFi0aBHa2tqcjh0yZAjCwsLw8ssvo76+Hj/4wQ/cfyEppSc30pC0tLQ+PwMg09PTFahGf7744gv58ssvy2HDhknc+tjZ4zZv3jz5wQcfyNDQ0D6P3X///fL73/++/Pe//917s25lkUEOIL2D3NbWJgHI6upqhSrSLndCu2vXLtnV1dXnuRaLxTEuNDRURkREyHfeeUd2d3c7eym3ssiz1gGM3VzuOXnyJDZu3Ig//elPuHr1ap/H582bh4KCAsycORMGw8CRmjJlCmpqahAWFoann34a69evx4MPPuhZke4m3sWNNKT3HhmADA4O7vc5q1evlsnJydJiscj9+/fLuXPn+rJExXmyp3XXvn37ZFpamjxw4IA7w3loTT3dHeTu7m4JQG7atMnl+MrKSmmxWGRXV5csKSmRDz/8sHzrrbf8UKl/+CO0XsBDa3LNnW6uyspKzJkzBwaDAbNmzUJzczPmzp3rrxK9ytuHx2qjvYrJK9zt5rrTzx0aGgqj0din51uNBgptdnY28vPzNRtaZ/TxLuieuTM3l9VqxZo1awDc6uc+e/YsWlpa+r2Kyt8CMbTO6PedkUvudnM99thjMJvNyMrKQnt7O95++2088cQT+OijjxAeHu6PUntgaPvh7odpFzfSkDsnu2bPni1v/enVa6ATUdnZ2Wo4EeUPPNlFzqltbi69n4jyB/5WAozSc3MxtL7B31SA8Wc318mTJ/HnP/8ZNpuNofUxXo8cQKxWK6qrqxEcHIzOzk6vbpuh9Rmu/UTOeTo3F0OrPtwjBxCTyYRTp07d00qLDK3i3Noj8+snlSovL5djxoyR8fHxct26dX0e7+jokAsXLpTx8fHy0UcflWfOnBlwmwaDod+vnb744gv50ksvqb33ONDwogmtunnzpoyLi5OnTp2SN27ckCkpKfL48eM9xrzxxhuyoKBASillSUmJXLhw4YDbBSALCwullAythjDIWnXw4EGZmZnpuL927Vq5du3aHmMyMzPlwYMHpZRSdnV1ycjISFcXpksppTx16pTTwDK0qudWFj36jGw2m2VYWNign69WSvcTt7a24ttvv8V3v/tdAMA333yD9vZ2fOc733GMOX78OBISEhASEgIA+Pzzz5GYmNjnc2pLSwsuXrwIKSWuX7+OiIgIjBw50jGHlF4o/Tfzlerq6uNSyuQBB7qbeGc3Z3NA6YHS72vbtm0yLy/Pcb+4uNhxSHyH2WyWDQ0NjvtxcXGypaWl3+2Gh4d7t1AVUfpv5isAjko3sshZNFXInSVj7h5z8+ZNXLlyBZGRkX6tk9SDQVahu5eM6ezsRGlpKbKzs3uMyc7OxpYtWwAA27dvx/Tp03V1qEz3xqMv/vLz871Vh6oo/b7cWTImLy8Pzz33HEwmE0aMGIHS0tIBt/vQQw/5oXplKP038yG3unfYEBJAXC0ZQ6rGJWOIAgWDTKQDHgV5xYoVGDduHFJSUrBgwQJcvnzZW3Upbtu2bTCbzRgyZIguDkcrKipQW1sLk8mEoqIipcvxmtzcXERFRSE5eeCvWrWkoaEB06ZNgxCiTghxXAjxQn/jPQpyRkYGamtrcezYMYwZMwbr1q3zZHOqkpycjB07dmDq1KlKl+Ixu92OwsJCJCQkoK6uDiUlJairq1O6LK9YunQpKioqlC7D6wwGA1577TVIKZMApAMoFEIkuRrvUZAzMzMdnUTp6elobGz0ZHOqkpiYiLFjxypdhldUVVXBZDIhNDQUISEhyMnJccxrrXVTp07V5UqS0dHRjskfpJRXAZwA4HIuYq99Rv7LX/6C2bNne2tz5EVNTU2IjY113I+JiUFTU5OCFdG9EEKMBjABwGFXYwb8HlkIsRfAKCcPvXLnq6s1a9bAYDBg0aJFgypUKY8//jjOnz/f5+dr1qzB/PnzFaiIqCchxFAA7wL4Lynlt67GDRhkKeXj/T2+efNm7Nq1C//4xz8011m0d+9epUvwC3daPkl9urq6gFsh/puUckd/Yz06tK6oqMAf/vAH7Ny5U5EJy8k9d1o+b9y44bLlk9RFSom8vDwAOCGl/G+3njDYW3x8vIyJiZGpqakyNTXVcaG7HuzYsUMajUYZEhIio6KielwfrEUffvihDA0NlXFxcfJ3v/ud0uV4TU5Ojhw1apQ0GAzSaDTKjRs3Kl2SV+zfv//O9eLHANTcvmVJX1yPDLZoagpbNDWJLZpEgYJBJtIBBplIBxhkIh1gkIl0gEEm0gEGmUgHGGSVuXTpEjIyMpCQkICMjAy0trY6HRcUFASLxQKLxcIuLWKQ1aaoqAgzZsxAfX09ZsyY4XISgLCwMNTU1KCmpgY7d+70c5WkNgyyypSVlWHJkiUAgCVLluD9999XuCLSAgZZZS5cuIDo6GgAwKhRo3DhwgWn4zo6OmC1WpGent5v2G02G6xWK6xWK1paWnxSMymPC9oqoL/roO8mhHB5aehXX30Fo9GI06dPY/r06Rg/fjzi4+P7jMvPz3fM+Wy1Wr1QPakRg6yA/q6Dfvjhh3Hu3DlER0fj3LlziIqKcjruzvXEcXFx+OEPf4jPPvvMaZApMPDQWmXuXgpmy5YtTmcqaW1txY0bNwAAFy9exIEDB5CU5HJeNgoADLLKrFy5Env27EFCQgL27t2LlStXAgCOHj2KZcuWAQBOnDgBq9WK1NRUTJs2DStXrmSQAxyvRw4gvB5Zk3g9MlGgYJCJdIBBJtIBBplIBxhkIh1gkIl0gEEm0gEGmUgHGGQiHWCQiXSAQSbSAQaZSAcYZCIdYJCJdIBBJtIBBplIBxhkIh1gkIl0gEFWmW3btsFsNmPIkCH9TstTUVGBsWPHwmQyuVyNggIHg6wyycnJ2LFjB6ZOnepyjN1uR2FhIcrLy1FXV4eSkhLU1dX5sUpSG85rrTKJiYkDjqmqqoLJZEJcXBwAICcnB2VlZZxJM4Bxj6xBTU1NiI2NddyPiYlBU1OT07FcMiYwcI+sgP6WjHE2Ib0nuGRMYGCQFdDfkjHuMBqNaGhocNxvbGx0LCFDgYmH1ho0adIk1NfX48yZM+js7ERpaSkXOw9wDLLKvPfee4iJiUFlZSXmzJmDmTNnAgDOnj2LrKwsAIDBYMCGDRswc+ZMJCYmYuHChTCbzUqWTQrjkjEBhEvGaBKXjCEKFAwykQ4wyEQ6wCAT6QCDTKQDDDKRDjDIRDrAIBPpAINMpAMMMpEOMMhEOsAgE+kAg0ykAwwykQ4wyEQ6wCAT6QCDTKQDDDKRDjDIKuPukjGjR4/G+PHjYbFYOM0tcTpctbmzZExBQcGAYz/55BM89NBDfqiK1I5BVhl3lowh6o2H1holhEBmZibS0tJgs9mULocUxj2yAryxZMy//vUvGI1GNDc3IyMjA+PGjXO6gqPNZnMEnWs/6ReDrABPl4wB4FgiJioqCgsWLEBVVZXTIHPtp8DAQ2sNam9vx9WrVx3//vHHHyM5OVnhqkhJDLLKuLNkzIULFzBlyhSkpqbi0UcfxZw5czBr1iwlyyaFccmYAMIlYzSJS8YQBQoGmUgHGGQiHWCQiXSAQSbSAQaZSAcYZCIdYJCJdIBBJtIBBplIBxhkIh1gkIl0gEEm0gEGmUgHGGQiHWCQiXSAQSbSAQaZSAcYZCIdYJBVZsWKFRg3bhxSUlKwYMECXL582em4iooKjB07FiaTCUVFRX6uktSGQVaZjIwM1NbW4tixYxgzZgzWrVvXZ4zdbkdhYSHKy8tRV1eHkpIS1NXVKVAtqQWDrDKZmZkwGG6tG5Ceno7GxsY+Y6qqqmAymRAXF4eQkBDk5OSgrKzM36WSing6HS75kBDiAwB/l1L+tdfPnwIwS0q57Pb95wB8T0q53Mk28gHk3757n5SSM9nrEJeMUYAQYi+AUU4eekVKWXZ7zCsAbgL4myevJaW0AeAqbzrHICtASvl4f48LIZYCmAtghnR+yNQEIPau+zG3f0YBip+RVUYIMQvALwFkSymvuRh2BECCEOI/hBAhAHIA7PRXjaQ+DLL6bAAwDMAeIUSNEOItABBCPCKE2A0AUsqbAJYD+AjACQD/K6U8rlTBpDye7CLSAe6RiXSAQSbSAQaZSAcYZCIdYJCJdIBBJtIBBplIB/4fCxRRV3UD8PUAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<Figure size 432x288 with 1 Axes>"
            ]
          },
          "metadata": {
            "tags": [],
            "needs_background": "light"
          }
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gNaC1A6Kc7aJ"
      },
      "source": [
        "Данное правило удовлетворяет введенным ранее аксиомам скалярного произведения. Таким образом, приведенное в примере пространство всех свободных векторов с так определенным скалярным произведением является евклидовым пространством."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dy6anLLgc7aK"
      },
      "source": [
        "__Пример__\n",
        "\n",
        "Примером евклидова пространства будет выступать $n$-мерное линейное пространство $\\mathbb{R}^{n}$ упорядоченных совокупностей $n$ вещественных чисел, скалярное произведение векторов $x=(a_{1},a_{2},...,a_{n})$ и $y=(b_{1},b_{2},...,b_{n})$ на котором определено как\n",
        "\n",
        "$$(x,y)=a_{1}b_{1}+a_{2}b_{2}+...+a_{n}b_{n}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LrvAun4Zc7aL"
      },
      "source": [
        "Очевидно, что определенные ранее аксиомы выполняются для этого правила."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "xZm-Q3Wrc7aN"
      },
      "source": [
        "То есть скалярное произведение между двумя векторами $x=(1,2,3)$ и $y=(4,5,6)$, принадлежащими пространству $\\mathbb{R}^{3}$, будет равняться \n",
        "\n",
        "$$(x,y)=1\\cdot4+2\\cdot5+3\\cdot6=4 + 10 + 18=32.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "CVVshT14c7aO"
      },
      "source": [
        "В Python cкалярное произведение двух векторов можно вычислять с помощью функции `numpy.dot(a, b)` или метода `vec1.dot(vec2)`, где `vec1` и `vec2` — исходные векторы."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "DwrZVBJfc7aP"
      },
      "source": [
        "import numpy as np"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Ka3mFpRtW-9d",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "4c74820f-7b78-484e-a891-d2a3abe9bbf2"
      },
      "source": [
        "a = np.array([1, 2, 3])\n",
        "b = np.array([4, 5,6])\n",
        "print(f'Скалярное произведение a и b:\\n{np.dot(a, b)}')\n",
        "print(f'Скалярное произведение a и b:\\n{a.dot(b)}')\n",
        "print(f'Скалярное произведение a и b:\\n{a @ b}')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Скалярное произведение a и b:\n",
            "32\n",
            "Скалярное произведение a и b:\n",
            "32\n",
            "Скалярное произведение a и b:\n",
            "32\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "kHg_vsjhc7ad"
      },
      "source": [
        "Введем теперь такие важные понятия, как _метрика_, _норма_ (или _длина_) вектора и _угол_ между векторами в произвольном евклидовом пространстве. Для этого нужно ввести понятие _линейных нормированных пространств._"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "VasUbr7Qc7af"
      },
      "source": [
        "### Линейные нормированные пространства"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QvHQeSnlc7ah"
      },
      "source": [
        "Для обобщения понятия длины вектора используется понятие _нормы_."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7ijI-1nIc7ai"
      },
      "source": [
        "__Определение__\n",
        "\n",
        "Линейное пространтсво $R$ называется _нормированным_, если на нем введено правило, согласно которому каждому элементу $x$ ставится в соответствие число, называемое _нормой_ (или _длиной_) этого элемента и обозначаемое символом $\\left\\|x\\right\\|$.\n",
        "\n",
        "Оно должно подчиняться трем аксиомам:<br>\n",
        "1) $\\left\\|x\\right\\|\\geq0$, причем $\\left\\|x\\right\\|=0\\Leftrightarrow x=0;$<br>\n",
        "2) $\\left\\|\\lambda x\\right\\|$ = $|\\lambda|\\left\\|x\\right\\|$;<br>\n",
        "3) $\\left\\| x + y \\right\\|$ <= $\\left\\|x\\right\\|$ + $\\left\\|y\\right\\|$.\n",
        "\n",
        "Последняя аксиома называется _неравенством треугольника_, или _неравенством Минковского_."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Ey4wIr-fc7aj"
      },
      "source": [
        "__Примеры__\n",
        "\n",
        "Существует много способов определния нормы.\n",
        "\n",
        "- $p$-норма (норма Гёльдера) для вектора $x = (x_{1}, \\dots, x_{n}) \\in \\mathbb{R}^{n}$ вычисляется по формуле:\n",
        "\n",
        "$$\\left\\| x \\right\\|_{p} = \\left( \\sum_{i} \\left| x_{i} \\right|^{p} \\right)^{1 / p},~p \\geq 1.$$\n",
        "\n",
        "В частных случаях при:\n",
        "\n",
        "- $p = 1$ получаем $\\ell_{1}$ норму (_манхэттенская норма_, или _манхэттенское расстояние_)\n",
        "\n",
        "$$\\left\\|x\\right\\|_{1} = \\sum_{i}|x_{i}|;$$\n",
        "\n",
        "- $p = 2$ получаем $\\ell_{2}$ норму (_евклидова норма_, наиболее часто используемая)\n",
        "\n",
        "$$\\left\\|x\\right\\|_{2} = \\sqrt{\\sum_{i}|x_{i}|^{2}}.$$"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "t7P1UQBNX3Pf"
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "5UOsib7Pc7am"
      },
      "source": [
        "Определим норму вектора вручную и при помощи Python.\n",
        "\n",
        "Для выполнения операций линейной алгебры в Python используется модуль `numpy.linalg`. Для вычисления различных норм используется функция `numpy.linalg.norm(x, ord=None)`, где `x` — исходный вектор, `ord` — параметр, обозначенный выше как $p$ и определяющий норму."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "H9M6n4a6c7ao"
      },
      "source": [
        "from numpy.linalg import norm"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "pDIsUYZoc7at"
      },
      "source": [
        "Зададим вектор $a=(1,2,-3)$:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "hwrsGk9DVFQr"
      },
      "source": [
        "a = np.array([1, 2, -3])"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "3WOx7uWxXOzd"
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KskdkMSkc7ay"
      },
      "source": [
        "Определим манхэттенскую норму вектора $a$:\n",
        "\n",
        "$$\\left\\|x\\right\\|_{1} = |1|+|2|+|-3|=6.$$"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "M-c6m83dXVWQ",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "f8b1a7e2-8ca7-49fa-dfd0-2e144636ba48"
      },
      "source": [
        "print(f'l1 Манхетовская норма вектора a:\\n{norm(a, ord=1)}')\n"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "l1 Манхетовская норма вектора a:\n",
            "6.0\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DmZb7h1Lc7a5"
      },
      "source": [
        "Определим евклидову норму вектора $a$:\n",
        "\n",
        "$$\\left\\|x\\right\\|_{2} = \\sqrt{1^{2}+2^{2}+(-3)^{2}}=\\sqrt{14}.$$"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "yQVpUMwCXaxq",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "0da29ef1-f871-4a38-859e-79bec748b32e"
      },
      "source": [
        "print(f'l2 Евклидова норма вектора а:\\n{norm(a, ord=2)}')\n",
        "# l2 евклидова норма вектора а:\n",
        "# 3.7416573867739413"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "l2 Евклидова норма вектора а:\n",
            "3.7416573867739413\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "0Rx5dazjc7bA"
      },
      "source": [
        "Можем убедиться, что различные нормы дают разные значения для одного и того же вектора."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mtsZ1ln-c7bB"
      },
      "source": [
        "__Теорема__\n",
        "\n",
        "Всякое евклидово пространство является нормированным, если норму любого элемента $x$ в нем определить как\n",
        "\n",
        "$$\\left\\|x\\right\\| = \\sqrt{(x,x)}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "L72LpJQtc7bD"
      },
      "source": [
        "Для любых $x,y$, принадлежащих евклидову пространству $E$ с так определенной нормой, имеет место неравенство \n",
        "\n",
        "$$|(x,y)|\\leq\\left\\|x\\right\\| \\left\\|y\\right\\|.$$\n",
        "\n",
        "Это выражение называется _неравенством Коши — Буняковского_."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "bPumnjaJc7bE"
      },
      "source": [
        "Докажем его. Возьмем вещественный элемент $\\lambda$ и рассмотрим элемент $x- \\lambda y\\in E$. \n",
        "\n",
        "Согласно аксиоме 4 для евклидова пространства, \n",
        "\n",
        "$$0\\leq(x-\\lambda y, x-\\lambda y)=(x,x)-2(x,y)\\lambda +(y,y)\\lambda^{2}.$$\n",
        "\n",
        "Полученный квадратный трехчлен относительно $\\lambda$ является уравнением параболы. Геометрически тот факт, что он больше или равен нулю при всех $\\lambda$, означает, что квадратное уравнение \n",
        "\n",
        "$$(y,y)\\lambda^{2}-2(x,y)\\lambda +(x,x)=0$$\n",
        "\n",
        "либо вовсе не имеет корней, либо имеет один корень. А это возможно только тогда, когда дискриминант такого уравнения меньше или равен нулю:\n",
        "\n",
        "$$D=4(x,y)^{2}-4(x,x)(y,y)\\leq0,$$\n",
        "\n",
        "из чего следует, что\n",
        "\n",
        "$$(x,y)^{2}\\leq\\left\\|x\\right\\|^{2}\\left\\|y\\right\\|^{2}.$$\n",
        "\n",
        "Неравенство Коши — Буняковского доказано."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "3iEqrvecc7bF"
      },
      "source": [
        "__Определение__\n",
        "\n",
        "В любом вещественном евклидовом пространстве можно ввести понятие _угла_ между двумя произвольными элементами $x$ и $y$. Углом $\\varphi \\in [0, \\pi]$ между этими элементами назовем угол, косинус которого определяется соотношением\n",
        "\n",
        "$$cos\\varphi = \\frac{(x,y)}{\\left \\|x\\right \\|\\cdot\\left \\|y\\right \\|}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-nJGUXBLc7bG"
      },
      "source": [
        "__Пример__\n",
        "\n",
        "Определим угол между векторами $a=(1,2,3)$, $b=(4,5,6)$."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Uefv3uBjc7bI"
      },
      "source": [
        "a = np.array([1, 2, 3])\n",
        "b = np.array([4, 5, 6])"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-SyO8gvJc7bO"
      },
      "source": [
        "$$cos\\varphi = \\frac{1\\cdot4+2\\cdot5+3\\cdot6}{\\sqrt{1^{2}+2^{2}+3^{2}}\\sqrt{4^{2}+5^{2}+6^{2}}}=\\frac{32}{\\sqrt{1078}}\\approx 0.97$$"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "Vo5de6euXq1a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 180
        },
        "outputId": "2d629610-113d-4d43-c2f3-9434032915de"
      },
      "source": [
        "cos_phi = np.dot(a, b) / norm(a) / norm(b)\n",
        "t\n"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "error",
          "ename": "NameError",
          "evalue": "ignored",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
            "\u001b[0;32m<ipython-input-3-25ade499789e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mcos_phi\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mnorm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m/\u001b[0m \u001b[0mnorm\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;31mNameError\u001b[0m: name 'np' is not defined"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "x4_NxqYrc7bY"
      },
      "source": [
        "Два произвольных элемента $x$ и $y$ евклидова пространства $E$ называются _ортогональными_, если их скалярное произведение равно нулю (в этом случае косинус угла $\\varphi$ между этими элементами будет равен нулю)."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ez9nUOZxc7ba"
      },
      "source": [
        "### Метрические пространства"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JGDcLQzvc7bb"
      },
      "source": [
        "Понятие расстояния в контексте машинного обучения обобщается с помощью _метрики_."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "m7iu-UITc7be"
      },
      "source": [
        "__Определение__\n",
        "\n",
        "Пара $(E, d)$, где $E$ — множество, а $d: E\\times E \\rightarrow \\mathbb{R}$ — вещественнозначная функция, называется _метрическим пространством_, если для всех $x,y,z\\in E$ выполняются условия:<br>\n",
        "1) $d(x,y)=d(y,x);$<br>\n",
        "2) $d(x,x)=0$; $d(x,y)>0$, если $x \\neq y$;<br>\n",
        "3) $d(x,z) \\leq d(x,y) + d(y,z)$ (неравенство треугольника).\n",
        "\n",
        "Функция $d$ с такими свойствами иногда обозначается  $\\left | x-y \\right |$ и называется _метрикой_, а $d(x,y)$ — _расстоянием между точками $x,y$_."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Ch3ftAD5c7bf"
      },
      "source": [
        "Любое нормированное пространство можно превратить в метрическое, определив $d(x,y) = \\left\\|x-y\\right\\|$."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "6fu25sQ4c7bi"
      },
      "source": [
        "__Пример__\n",
        "\n",
        "Как и в случае нормы, существует ряд различных методик определения метрики, например, _евклидова метрика_\n",
        " \n",
        "$$d_{2}(x,y) = \\sqrt{\\sum_{i}(x_{i}-y_{i})^{2}}$$\n",
        "\n",
        "и _манхэттенская метрика_:\n",
        "\n",
        "$$d_{1}(x,y) = \\sum_{i}|x_{i}-y_{i}|.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "w-HqJgBUc7bj"
      },
      "source": [
        "Определим расстояние между векторами $a=(1,2,3)$, $b=(4,5,6)$."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "XRaiV-Tgc7bk"
      },
      "source": [
        "a = np.array([1, 2, 3])\n",
        "b = np.array([4, 5, 6])"
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Qs0Eqqrfc7bp"
      },
      "source": [
        "Один способ — посчитать метрику как $\\left\\|a-b\\right\\|$, как было сказано выше:"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "XSaqNfk0c7bs",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "12b2ad2d-83dd-4c49-98b0-12737dc6627c"
      },
      "source": [
        "print(f'l1 расстояние между векторами a и b:\\n{norm(a - b, ord=1)}')\n"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "l1 расстояние между векторами a и b:\n",
            "9.0\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "FRKdP_7wc7by",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "be77ef9f-46ad-44fb-ee50-ef8374e3dc79"
      },
      "source": [
        "print(f'l2 расстояние между векторами a и b:\\n{norm(a - b, ord=2)}')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "l2 расстояние между векторами a и b:\n",
            "5.196152422706632\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vufDAv6vc7b3"
      },
      "source": [
        "Второй способ посчитать расстояние — использовать функцию `scipy.spatial.distance.cdist(XA, XB, metric='euclidean', p=2, ...)` из модуля SciPy, предназначенного для выполнения научных расчетов. Параметры `XA, XB` — исходные векторы, а `metric` и `p` задают метрику расстояния.\n",
        "\n",
        "Эта функция требует, чтобы размерность массивов `XA` и `XB` была как минимум двумерная, поэтому для использования этой функции исходные векторы необходимо преобразовать в _вектор-строки_ (матрица размера $1\\times m$) или _вектор-столбцы_ (матрица размера $n\\times1$). Матрицы как струкутры данных будут рассмотрены нами в следующих уроках."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "piZvlwrWPmTN"
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "kzujXfVr2CUy"
      },
      "source": [
        ""
      ],
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "N78Ehtojc7b4"
      },
      "source": [
        "Есть различные способы преобразования вектора в вектор-строку или вектор-столбец. Первый — использовать метод `array.reshape(shape)`, где кортеж `shape` задает размерность получаемого массива."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "XlmcgaBvc7b5",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "f839b968-f9e6-491a-9d99-5310a5292acc"
      },
      "source": [
        "print(f'Вектор а: {a}')\n",
        "print(f'Его размерность: {a.shape}')\n",
        "print(f'Вектор b: {b}')\n",
        "print(f'Его размерность: {b.shape}')\n",
        "\n",
        "a = a.reshape((1, 3))\n",
        "b = b.reshape((1, 3))\n",
        "\n",
        "print('\\nПосле применения метода reshape:')\n",
        "print(f'Вектор-строка a: {a}')\n",
        "print(f'Его размерность: {a.shape}')\n",
        "print(f'Вектор-строка b: {b}')\n",
        "print(f'Его размерность: {b.shape}')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Вектор а: [1 2 3]\n",
            "Его размерность: (3,)\n",
            "Вектор b: [4 5 6]\n",
            "Его размерность: (3,)\n",
            "\n",
            "После применения метода reshape:\n",
            "Вектор-строка a: [[1 2 3]]\n",
            "Его размерность: (1, 3)\n",
            "Вектор-строка b: [[4 5 6]]\n",
            "Его размерность: (1, 3)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "9xAeyZDtc7b_",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "153584b6-60a7-4230-9345-485b067ae370"
      },
      "source": [
        "from scipy.spatial.distance import cdist\n",
        "print(f'Манхэттенское расстояние между a и b:\\n{cdist(a, b, metric=\"cityblock\")}')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Манхэттенское расстояние между a и b:\n",
            "[[9.]]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Lz3T0A-Uc7cE"
      },
      "source": [
        "Еще один способ преобразования вектора для получения возможности определения расстояния при помощи cdist — использование функции `np.newaxis`."
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "nr-_mbJhc7cG",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 231
        },
        "outputId": "d7296cde-ccc1-456c-8bd9-618ae33a0e27"
      },
      "source": [
        "a = np.array([1, 2, 3])\n",
        "b = np.array([4, 5, 6])\n",
        "print(f'Преобразование вектора a в вектор-строку:\\n{a[np.newaxis, :]}')\n",
        "print(f'Полученная размерность:{a[np.newaxis, :].shape}')\n",
        "\n",
        "print(f'Преобразование вектора b в вектор-столбец:\\n{b[:, np.newaxis]}')\n",
        "print(f'Полученная размерность:{b[:, np.newaxis].shape}')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "error",
          "ename": "NameError",
          "evalue": "ignored",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mNameError\u001b[0m                                 Traceback (most recent call last)",
            "\u001b[0;32m<ipython-input-2-e5e7ec560e8a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0mb\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'Преобразование вектора a в вектор-строку:\\n{a[np.newaxis, :]}'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'Полученная размерность:{a[np.newaxis, :].shape}'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;31mNameError\u001b[0m: name 'np' is not defined"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "id": "svciKKAPc7cQ",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "2055417a-4f90-4e6d-c924-8502786d115e"
      },
      "source": [
        "print(f'Евклидово расстояние между a и b:\\n{cdist(a[np.newaxis, :], b[np.newaxis, :], metric=\"euclidean\")}')"
      ],
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Евклидово расстояние между a и b:\n",
            "[[5.19615242]]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "oOWx-qfJc7cW"
      },
      "source": [
        "### Базис в евклидовом пространстве"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "O0LP3TnJc7cX"
      },
      "source": [
        "Как было сказано ранее, в евклидовом пространстве $E$ элементы $x$ и $y$ называются _ортогональными_, если\n",
        "\n",
        "$$(x,y)=0.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "-_C1u_e8c7ca"
      },
      "source": [
        "То есть можно заключить, что данное равенство означает, что угол между векторами должен равняться $90^{\\circ}$. Это же справедливо и для произвольного евклидова пространства, а также отсюда следует, что нулевой элемент евклидова пространства ортогонален любому элементу."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "10MxUo4Dc7cc"
      },
      "source": [
        "__Определение.__ В конечномерном евклидовом пространстве базис $\\{e_{1},e_{2},...,e_{n}\\}$ называется ортонормированным, если \n",
        "\n",
        "$(e_{i}, e_{j})=0$ $\\forall$ $i\\neq j$ и $(e_{i},e_{i})=1$ $\\forall$ $i\\in[1, n].$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "0OK9PGgXc7cd"
      },
      "source": [
        "Это означает, что ортонормированный базис является ортогональным и состоит из векторов единичной длины."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "UT6PV7xlc7ce"
      },
      "source": [
        "Часто на практике возникает необходимость произвести переход от произвольного базиса $\\{a_{1}, a_{2}, ...,a_{n}\\}$ в определенном евклидовом пространстве к ортонормированному. Для этого нужно сперва _ортогонализировать_ его, а затем _нормировать_:\n",
        "\n",
        "- первая часть называется процесс ортогонализации Грама-Шмидта. Она производится следующим образом.\n",
        "\n",
        "    Возьмем вначале $e_{1}=a_{1}$.<br>\n",
        "    Второй элемент нового ортогонального базиса будем искать в виде $e_{2}=a_{2}+\\alpha_{1}e_{1}.$\n",
        "    \n",
        "    $\\alpha_{1}$ подберем из условия ортогонального базиса $(e_{1}, e_{2})=0$. Из этого следует, что \n",
        "    \n",
        "    $$(e_{1}, a_{2}+\\alpha_{1}e_{1})=(e_{1}, a_{2})+(e_{1},\\alpha_{1}e_{1})=0,$$\n",
        "    \n",
        "    \n",
        "$$\\alpha_{1}=-\\frac{(e_{1}, a_{2})}{(e_{1},e_{1})}.$$\n",
        "    \n",
        "\n",
        "    \n",
        "    "
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "52bJc9E4c7cf"
      },
      "source": [
        "    \n",
        "   k-й элемент нового базиса будет иметь вид \n",
        "   \n",
        "   $$e_{k}=a_{k}+\\sum_{j=1}^{k-1}\\alpha_{j}e_{j},$$\n",
        "    \n",
        "   а $\\alpha_{i}$ —\n",
        "    \n",
        "   $$\\alpha_{i}=-\\frac{(e_{i}, a_{k})}{(e_{i},e_{i})}, i\\in[1, k-1].$$\n",
        "    \n",
        "   Ортогонализация продолжается до окончания множества исходных элементов, после чего следует вторая часть:\n",
        "    \n",
        "- элементы $e_{i}$ достаточно пронормировать для получения ортонормированного базиса:\n",
        "    \n",
        "    $$e_{i}'=\\frac{e_{i}}{|e_{i}|}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1p3yEbsYc7cg"
      },
      "source": [
        "Примером ортонормированного базиса может служить декартов прямоугольный базис евклидова пространства $E^{n}$:\n",
        "\n",
        "$$e_{1}=(1,0,0,...,0),$$\n",
        "$$e_{2}=(0,1,0,...,0),$$\n",
        "$$...$$\n",
        "$$e_{n}=(0,0,0,...,1).$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wYEipVAZc7ch"
      },
      "source": [
        "Рассмотрим плюсы ортонормированного базиса по сравнению с обычным неортогональным."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "gl49-J4sc7cn"
      },
      "source": [
        "Возьмем некоторое пространство с ортонормированным базисом $\\{e_{1},e_{2},...,e_{n}\\}$, выберем два произвольных вектора $x$ и $y$ в нем и разложим их по базису: \n",
        "\n",
        "$$x=\\xi_{1} e_{1}+ \\xi_{2} e_{2}+...+\\xi_{n} e_{n},$$\n",
        "$$y=\\eta_{1} e_{1}+ \\eta_{2} e_{2}+...+\\eta_{n} e_{n}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "EjmrQcUoc7cq"
      },
      "source": [
        "Коэффициенты $\\xi_{i}$ и $\\eta_{i}$ будут координатами соответствующих векторов в существующем базисе. Вычислим их скалярное произведение:\n",
        "\n",
        "$$(x,y)=(\\xi_{1} e_{1}+ \\xi_{2} e_{2}+...+\\xi_{n} e_{n},\\eta_{1} e_{1}+ \\eta_{2} e_{2}+...+\\eta_{n} e_{n}).$$\n",
        "\n",
        "Учитывая свойства ортонормированного базиса (обнуление всех скалярных произведений $(e_{i}, e_{j})=0$) и $(e_{i}, e_{i})=1$, получим, что \n",
        "\n",
        "$$(x,y)=\\xi_{1}\\eta_{1} + \\xi_{2} \\eta_{2}+...+\\xi_{n}\\eta_{n}.$$"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "DoG0Hea-c7cr"
      },
      "source": [
        "Таким образом, _в евклидовом пространстве с ортонормированным базисом скалярное произведение двух векторов равняется сумме произведений соответствующих координат этих векторов в этом базисе_."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "B6bf-1D-c7ct"
      },
      "source": [
        "Также особенностью ортонормированного базиса является то, что _координаты произвольного элемента относительно ортонормированного базиса равны скалярным произведениям этого элемента на соответствующие базисные элементы._"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KwJfh57iaa8A"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "rnPVQP84c7cu"
      },
      "source": [
        "## Практическое задание"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "81d4BnNXc7cy"
      },
      "source": [
        "__1.__ Найти скалярное произведение векторов $x, y \\in \\mathbb{R}$:<br>\n",
        "а) $x=(0,-3, 6),~y=(-4, 7, 9);$<br>\n",
        "б) $x=(7, -4, 0, 1),~y=(-3, 1, 11, 2).$\n",
        "\n",
        "__2.__ Найти нормы векторов $(4, 2, 4)$ и $(12, 3, 4)$ и угол между ними.\n",
        "\n",
        "__3.__ Будет ли линейное пространство евклидовым, если за скалярное произведение принять:<br>\n",
        "а) произведение длин векторов;<br>\n",
        "б) утроенное обычное скалярное произведение векторов?<br>\n",
        "      \n",
        "__4.__ Какие из нижеперечисленных векторов образуют ортонормированный базис в линейном пространстве $\\mathbb{R}^{3}$:<br>\n",
        "а) $(1,0,0),(0,0,1);$ <br>\n",
        "б) $(1/\\sqrt{2},-1/\\sqrt{2},0),(1/\\sqrt{2},1/\\sqrt{2},0), (0,0,1);$<br>\n",
        "в) $(1/2, -1/2, 0), (0, 1/2, 1/2), (0,0,1);$<br>\n",
        "г) $(1,0,0),(0,1,0),(0,0,1)?$ \n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "A_BPNmWbUN0N"
      },
      "source": [
        ""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Dy-9B3Uwc7cz"
      },
      "source": [
        "## Литература\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "OXmdG8f3c7c0"
      },
      "source": [
        "1. Ильин В. А., Позняк Э. Г. Линейная алгебра: Учеб. для вузов. — 6-е изд. — М.: Физматлит, 2005.\n",
        "2. Кострикин А. И., Манин Ю. И. Линейная алгебра и геометрия. Учеб. пособие для вузов. — 2-е изд. — М.: Наука, Главная редакция физико-математической литературы, 1986.\n",
        "3. Шерстнева А. И., Янущик О. В. Линейные пространства. Линейные операторы: учебное пособие. Томск: Изд-во Томского политехнического университета, 2010."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JOAQaPnDc7c1"
      },
      "source": [
        "## Дополнительные материалы"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "sSWpQjS6c7c2"
      },
      "source": [
        "1. [Манхэттенская метрика](https://ru.wikipedia.org/wiki/Расстояние_городских_кварталов).\n",
        "\n",
        "2. [Евклидова метрика](https://ru.wikipedia.org/wiki/Евклидова_метрика).\n",
        "\n",
        "3. [Скалярное произведение в Python](http://docs.scipy.org/doc/numpy/reference/routines.linalg.html#matrix-and-vector-products).\n",
        "\n",
        "4. [Документация по нормам в NumPy](http://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.linalg.norm.html)\n",
        "\n",
        "5. [Документация по метрикам в SciPy](http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.spatial.distance.cdist.html)"
      ]
    }
  ]
}